<?php

//后台"品"字页面控制器
namespace Admin\Controller;
use Components\AdminController;

class GoodsController extends AdminController {
    //展示列表
    function showlist1(){
        //使用model模型(获得具体数据信息)
        //$goods = new \Model\GoodsModel;
        //var_dump($goods);
        
        //$qq = new \Model\QqModel;
        //var_dump($qq);
        
        //$obj = D();  //实例化Model对象
        $obj = M('User');  //实例化Model对象，并调用User数据表操作
        var_dump($obj);
        
        $this -> display();
    }
    
    function showlist2(){
        //获得商品表goods的全部记录信息
        $goods = new \Model\GoodsModel;
        $info = $goods -> select();
        
        //查询主键id值等于具体条件的记录信息
        $info = $goods -> select(37);
        
        //查询主键值id 在某个范围之内
        $info = $goods -> select('13,15,27,30');
        
        //assign和display方法本身是父类Controller对应的方法
        //在父类里边已经把smarty对象给封装好了
        //在这个两个方法里边已经把smarty对象给封装好了
        //，并且也有调用smarty对应assign和display方法调用
        $this -> assign('info', $info);
        $this -> display();
    }
    
    function  showlist3(){
        $goods = new \Model\GoodsModel;
        //$info = $goods -> select(16);
        $info = $goods -> find(16);  //返回一维数组
        $info = $goods -> find("10,12,13,15"); //返回一维数组的一条记录
        
        //查询字段goods_weight=3333的记录信息
        //select * from sw_goods where goods_weight=3333 limit 1
        //getBy系列方法被正确调用，实际在类的内部并没有此方法
        //在父类Model里边通过__call()魔术方法有集成好
        $info = $goods -> getBygoods_weight(3333);
        $info = $goods -> getBygoods_price(2300);
        
        show_bug($info);
        
        $this -> assign('info', $info);
        $this -> display();
    }
    
    function  showlist4(){
        $goods = new \Model\GoodsModel;
        show_bug($goods);
        //各种限制条件查询
        //① where查询  where goods_name like '诺%'
//        $goods ->where("goods_name like '诺%'");
//        $goods -> where('goods_price > 1000');
//        $goods -> where("goods_price > 1000 and goods_name like '诺%'");
//        $info = $goods -> select();
        //where()方法本身执行完毕有return $this;返回当前对象因此可以如下连贯操作
//        $info = $goods -> where("goods_name like '诺%'")->select();
        
        //② limit操作
        //$goods -> limit(6);
        //$info = $goods -> select();
//        $info = $goods -> limit(4)->select();
//        $info = $goods -> limit(10,5)->select();
//        
//        //③ field()查询指定字段
//        $info = $goods -> field('goods_name,goods_price')->select();
//        
//        //④ order()根据价格排序查询结果
//        $info = $goods -> order("goods_price")->select();
//        $info = $goods -> order("goods_price desc")->select();
//        
//        //⑤ group()分组查询
//        $info = $goods ->field('goods_category_id')-> group('goods_category_id')->select();
//        //show_bug($info);
//        
//        //⑥ distinct()去除重复信息方法
//        //注意：该方法需要结合field()一起使用
//        $info = $goods -> field('goods_category_id')->select();
//        $info = $goods ->field('goods_category_id')->distinct('goods_category_id')->select();
//        
//        
//        $info = $goods->limit(6) -> where('goods_price>1000')->select();
        
        $info=$goods->field('goods_name,goods_price')->where('goods_price>1000')->order('goods_price')->select();
        
        $this -> assign('info', $info);
        $this -> display();
    }
    
    function showlist(){
        $goods = new \Model\GoodsModel;
        //数据分页显示
        //① 获得当前数据表记录总数目
        $tot = $goods -> count();
        $per = 7;
        //② 实例化分页类对象
        $page_obj = new \Components\Page($tot, $per);
        
        //③ 拼装每页显示信息的sql语句
        //分页类里边有属性limit，可以帮组我们灵活获得limit信息
        $sql = "select * from sw_goods order by goods_id desc ".$page_obj->limit;
        $info = $goods -> query($sql);

        //④ 通过分页类的一个已有方法获得页码列表
        $pagelist = $page_obj -> fpage(array(3,4,5,6,7,8));
        
        $this -> assign('info', $info);
        $this -> assign('pagelist', $pagelist);
        $this -> display();
    }
    
    //添加商品页面
    function tianjia1(){
        //以下两种对象都可以调用add方法实现数据添加
        //$goods = new \Model\GoodsModel;
        $obj = D('Goods');
        $da = array(
            'goods_name'=>'三星手机6s',
            'goods_price'=>'4999',
            'goods_weight'=>'130',
            'goods_number'=>'12',
        );
        $goods -> add($da);
        //$obj -> add($da);
        
        //通过AR方式实现数据添加
        //$this->data,以下四行代码最后把信息都给到$this->data里边
        //$obj 调用以下本身不存在的属性，就会调用魔术方法__set();
        $obj -> goods_name = "iphone6手机";
        $obj -> goods_price = "5500";
        $obj -> goods_weight = "120";
        $obj -> goods_number = "7";
        $z = $obj -> add();   //返回新记录主键id值
        show_bug($z);

        $this -> display();
    }
    
    function tianjia(){
        //实现两个逻辑：收集表单信息、展示表单
        $obj = D('Goods');
        if(!empty($_POST)){
            //收集表单信息
            //tp框架建议我们通过方法create(）进行表单数据收集
            //①收集表单数据②对非法字段进行过滤③表单验证④自动映射和自动完成
            $obj -> create();
            
            //判断是否上传图片
            if(!empty($_FILES)){
                $cfg = array(
                    //图片保存根目录路径
                    'rootPath'      =>     './Uploads/', //附件保存根路径
                );
                $up = new \Think\Upload($cfg);
                $z = $up ->uploadOne($_FILES['goods_pic']);
                //$z 返回值里边已经拥有上传后附件的全部信息
                if(!$z){
                    show_bug($up->getError());
                    exit;
                } else {
                    //利用$z 数组下标：savename 和 savepath 拼装上传后附件的路径名
                    //$goods_pic = "./Uploads/".$z['savepath'].$z['savename'];
                    $goods_pic = $up->rootPath.$z['savepath'].$z['savename'];
                    $obj -> goods_big_img = ltrim($goods_pic,"\.");
                    
                    //根据以上传大图，生成一个小的缩略图
                    $im = new \Think\Image();
                    $im -> open($goods_pic);//把被处理图片给打开
                    //$im -> thumb(150,150);//制作缩略图[宽、高等比例]
                    $im -> thumb(150,150,2);//制作缩略图[宽、高等比例]
                    //533a659c39ac7.jpg
                    //small_533a659c39ac7.jpg
                    $goods_small = $up->rootPath.$z['savepath']."small_".$z['savename'];
                    $zz = $im -> save($goods_small);//把图片给保存到一个目录地址里边
                    $obj -> goods_small_img = ltrim($goods_small,"\.");
                }
            }
            $z = $obj -> add();
            
            if($z){
                $this ->redirect('showlist',array(),3,'添加商品成功');
            } else{
                $this ->redirect('showlist',array(),3,'添加商品失败');
            }
        } else {
            $this -> display();
        }
    }

    //修改商品信息
    function upd1(){
        $obj = D('Goods');
        //数组方式实现数据修改
        $da = array(
           //'goods_id' => 65,
            'goods_name'=>'华为手机',
            'goods_price'=>'1200',
            'goods_weight'=>'90',
        );
        $z = $obj ->where("goods_id in (67,68)")-> save($da);  //返回受影响的记录条数
        //update sw_goods set goods_name='华为手机','goods_price'=1200,goods_weight=90
        //以上sql语句在mysql里边没有问题，就是会把数据表全部记录都给修改了
        //在tp框架里边处于对系统数据的保护，不允许我们一次性修改数据表的全部数据
        
        show_bug($z);  
        $this -> display();
    }
    
    //参数$goods_id和$name，是每次请求upd方法必须传递的get变量参数,名字也是与goods_id和name一致
    function upd($goods_id){
        $obj = D('Goods');
        if(!empty($_POST)){
            //收集表单数据并调用save方法
            $obj -> create();
            if($obj -> save()){
                $this -> redirect('showlist',array(),3,'修改商品信息成功');
            } else {
                $this -> redirect('showlist',array(),3,'修改商品信息失败');
            }
        } else {
            //根据$goods_id信息从查询被修改的商品信息
            $info = $obj->find($goods_id);

            $this -> assign('info', $info);
            //需要知道当前修改的商品信息是哪个？
            $this -> display();
        }
    }
    
    //设置缓存
    function s1(){
        //文件缓存不设置缓存时间，则永久有效
        //S(name,value,time);
        S('username','linken',10);
        S('age',23,15);
        S('hobby',array('篮球','排球','高尔夫球'),20);
        echo "设置缓存成功";
    }
    //读取缓存信息
    function s2(){
        echo S('username');
        echo S('age');
        print_r(S('hobby'));
    }
    //手动删除缓存信息
    function s3(){
        //S(name,null);  //删除指定名称的缓存变量
        S('age',null);  //缓存文件就被删除掉
    }
    
    //getInfo方法原则上不是通过url地址直接访问的方法
    //该方法是被其他方法调用进而提供数据信息
    function getInfo(){
        //① 先跑到缓存里边获得数据信息
        //② 缓存里边没有数据信息，则去数据库获得信息
        //③ 每次从数据库获得信息后立刻生成缓存供下次调用
        $info = S('goods_info');
        if($info){
            return $info;
        } else {
            //获得数据库对应的信息
            $data = "htc_one".time();
            S('goods_info', $data, 10);
            return $data;
        }
    }
    function ss(){
        //调用getInfo方法获得商品信息
        echo $this -> getInfo();
    }
    function sa(){
        //调用getInfo方法获得商品信息
        echo $this -> getInfo();
    }
    function sc(){
        //调用getInfo方法获得商品信息
        echo $this -> getInfo();
    }
    
}
